/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Logistica.DAO;

import com.dp1.pucp.Modelo.Clases.Lineapedidocompra;
import com.dp1.pucp.Modelo.Clases.RecetaPfMp;
import com.dp1.pucp.Modelo.Clases.Materiaprima;
import com.dp1.pucp.Modelo.Clases.Pedidocompra;
import com.dp1.pucp.Modelo.Clases.Pedidoproduccion;
import com.dp1.pucp.Modelo.Clases.Productosimulacion;
import com.dp1.pucp.Modelo.Clases.Simulacion;
import com.dp1.pucp.Modelo.Clases.Tipoproducto;
import com.dp1.pucp.Util.HibernateUtil;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 * @author ubuntu64
 */
public class ProcesarPedidosDAO {
    
    public ArrayList<Simulacion> getSimulacionesActivas() {
    ArrayList<Simulacion> listaResultados = new ArrayList<>();       
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Simulacion where estado=1").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {    
                Simulacion s = (Simulacion) iter.next();
                Hibernate.initialize(s.getIdsimulacion());
                Hibernate.initialize(s.getEstado());
                
                listaResultados.add(s);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
    }
//   
    
     public ArrayList<Productosimulacion> getProductosxSimulaciones(int cod) {
    ArrayList<Productosimulacion> listaResultados = new ArrayList<>();       
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Productosimulacion where idsimulacion="+cod+" and idtipoproducto in (9,10,11)").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {    
                Productosimulacion s = (Productosimulacion) iter.next();
                Hibernate.initialize(s.getIdproductosimulacion());
                Hibernate.initialize(s.getCantProducida());
                Hibernate.initialize(s.getTipoproducto());
                Hibernate.initialize(s.getTipoproducto().getIdtipoproducto());
                Hibernate.initialize(s.getSimulacion().getIdsimulacion());
                
                listaResultados.add(s);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
    }
     
          
    public Tipoproducto getTipoProducto(int idtipo){
        Tipoproducto tipo = new Tipoproducto();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
             List lista = session.createQuery("from Tipoproducto where idtipoproducto="+ idtipo +"").list();        
            Iterator iter = lista.iterator();
             if (iter.hasNext()) {   
                tipo = (Tipoproducto) iter.next();
                Hibernate.initialize(tipo.getIdtipoproducto());          
                Hibernate.initialize(tipo.getNombre());             
                Hibernate.initialize(tipo.getDescripcion());
                Hibernate.initialize(tipo.getTipo());
                Hibernate.initialize(tipo.getMaxPolitica());
                Hibernate.initialize(tipo.getMinPolitica());
                Hibernate.initialize(tipo.getEstado());
                Hibernate.initialize(tipo.getFactorVol());
                
            }        
            tx.commit();
        }catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return tipo;
        }         
    }
    
    public ArrayList<RecetaPfMp> getReceta(int cod) {
    ArrayList<RecetaPfMp> listaResultados = new ArrayList<>();       
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from RecetaPfMp where idtipoproducto_pf="+cod).list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {    
                RecetaPfMp s = (RecetaPfMp) iter.next();
                Hibernate.initialize(s.getIdrecetaPfMp());
                Hibernate.initialize(s.getCantidad());
                Hibernate.initialize(s.getTipoproductoByIdtipoproductoMp());
                Hibernate.initialize(s.getTipoproductoByIdtipoproductoMp().getIdtipoproducto());
                Hibernate.initialize(s.getTipoproductoByIdtipoproductoPf());
                Hibernate.initialize(s.getTipoproductoByIdtipoproductoPf().getIdtipoproducto());
                
                listaResultados.add(s);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
    }
    
    public ArrayList<Tipoproducto> getInsumos() {
    ArrayList<Tipoproducto> listaResultados = new ArrayList<>();       
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Tipoproducto where tipo='MP'").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {    
                Tipoproducto s = (Tipoproducto) iter.next();
                Hibernate.initialize(s.getIdtipoproducto());
                Hibernate.initialize(s.getNombre());
                Hibernate.initialize(s.getUnidades());
                
                listaResultados.add(s);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
    }
    
    public ArrayList<Materiaprima> getMateriasPrimas() {
    ArrayList<Materiaprima> listaResultados = new ArrayList<>();       
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Materiaprima ").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {    
                Materiaprima s = (Materiaprima) iter.next();
                Hibernate.initialize(s.getIdmateriaprima());
                Hibernate.initialize(s.getCantidad());
                Hibernate.initialize(s.getTipoproducto());
                Hibernate.initialize(s.getTipoproducto().getIdtipoproducto());
                listaResultados.add(s);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
    }
    
    
     public Pedidocompra sacarUltPedido()
    {
        int cont=0;
        ArrayList<Pedidocompra> listaResultados = new ArrayList<>();       
        
        //String lista=null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Pedidocompra order by idpedidocompra").list();        
            Iterator iter = lista.iterator();
            
            while (iter.hasNext()) {    
                Pedidocompra p = (Pedidocompra) iter.next();
                Hibernate.initialize(p.getCodigo());
                Hibernate.initialize(p.getEstado());
                Hibernate.initialize(p.getFechasolicitud());
                //Hibernate.initialize(p.getLineaordencompras());
                Hibernate.initialize(p.getIdpedidocompra());
                Hibernate.initialize(p.getLineapedidocompras());
                Hibernate.initialize(p.getMotivo());
                Hibernate.initialize(p.getOrdencompras());
                cont=cont+1;
                listaResultados.add(p); 
            }
            tx.commit();
            
            } catch(HibernateException e) {
            throw new HibernateException(e);  
        }finally {
            session.close();
            if (cont==0){
                Pedidocompra PedNuevo=new Pedidocompra();

                return PedNuevo;
            }
            else{
                return (listaResultados.get(cont-1));
            }    
        }           
    }
    
       public Pedidocompra guardarPedido(Pedidocompra pedido){
         Pedidocompra c = new Pedidocompra();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();
        try {
            session.saveOrUpdate(pedido);
            session.flush();
         
        }catch(HibernateException e) {
            throw new HibernateException(e);
        } finally {
            
            session.persist(pedido);
            
            int cod = pedido.getIdpedidocompra();
            
            List lista = session.createQuery("from Pedidocompra where idpedidocompra="+cod).list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                c = (Pedidocompra) iter.next();
            }        
            tx.commit();
            session.close();
            return c;
        }
        
    }
    
      public void guardarLineaPedido(Lineapedidocompra lineapedido){
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();
        try {
            Lineapedidocompra ultPedido=sacarUltLineaPedido();
            if (ultPedido.getIdlineapedidocompra()==0) 
                session.saveOrUpdate(lineapedido);  

            else if((ultPedido.getPedidocompra().getIdpedidocompra()!=lineapedido.getPedidocompra().getIdpedidocompra())){
                 session.saveOrUpdate(lineapedido);    
       
            }
            else{
               if((ultPedido.getTipoproducto().getIdtipoproducto()!=lineapedido.getTipoproducto().getIdtipoproducto())){
                 session.saveOrUpdate(lineapedido); 
               }
            }
            tx.commit();
            
        }catch(HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();            
     }        
    }
    
       public Lineapedidocompra sacarUltLineaPedido()
    {
        int cont=0;
        ArrayList<Lineapedidocompra> listaResultados = new ArrayList<>();       
        
        //String lista=null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Lineapedidocompra order by idlineapedidocompra").list();        
            Iterator iter = lista.iterator();
            
            while (iter.hasNext()) {    
                Lineapedidocompra p = (Lineapedidocompra) iter.next();
                Hibernate.initialize(p.getCosto());
                Hibernate.initialize(p.getCantidad());
                Hibernate.initialize(p.getIdlineapedidocompra());
                //Hibernate.initialize(p.getLineaordencompras());
                Hibernate.initialize(p.getPedidocompra());
                Hibernate.initialize(p.getProveedor());
                Hibernate.initialize(p.getTipoproducto());
                cont=cont+1;
                listaResultados.add(p); 
            }
            tx.commit();
            
            } catch(HibernateException e) {
            throw new HibernateException(e);  
        }finally {
            session.close();
            if (cont==0){
                Lineapedidocompra LineaPedNuevo=new Lineapedidocompra();

                return LineaPedNuevo;
            }
            else{
                return (listaResultados.get(cont-1));
            }    
        }           
    }
       
          public void guardarSimulacion (Simulacion s){
     Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();
        try {
            session.saveOrUpdate(s);
            tx.commit();
        }catch(HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();            
        }        
    }
}
